﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using ProyectoSelva.Daos;
using EntitiesAndMappings.Entities;
using ProyectoSelva.Util;
using ProyectoSelva.Validate;

namespace ProyectoSelva.Forms.Operaciones
{
    public partial class FrmRenovacionContrato : Form,IValidateForm
    {
        public Boolean CerroSinAccion { get; set; }

        private Contrato contrato;

        private Boolean _valido;

        public FrmRenovacionContrato(Contrato contrato)
        {
            CerroSinAccion = false;
            InitializeComponent();
            _valido = true;
            this.contrato = contrato;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            _valido = true;
            errorProvider.Clear();
            FormsAssert.AssertComboBoxSelected(cmbMotivoLiquidacion, errorProvider, this);
            if (cmbMotivoLiquidacion.SelectedIndex==0)
            {
                errorProvider.SetError(cmbMotivoLiquidacion,@"Debe seleccionar un motivo de liquidación");
            }
            else
            {
                contrato.MotivoLiquidacion = cmbMotivoLiquidacion.SelectedItem as MotivoLiquidacion;
                contrato.ObservacionesRenovacion = txtObservacionRenovacion.Text;
                ActionExecutor.Execute(this, delegate
                {
                    var contratoDAO = new ContratoDAO();
                    contratoDAO.Actualizar(contrato);
                });
            }
            Close();
        }
        
        private void FrmActualizarContrato_Load(object sender, EventArgs e)
        {
            lblCodigoPersonal.Text = contrato.Trabajador.Codigo;
            lblNombreCompleto.Text = contrato.Trabajador.ApellidosYNombres;
            lblEmpresa.Text = contrato.Empresa.Descripcion;
            lblProyecto.Text = contrato.Proyecto.Descripcion;
            lblLote.Text = contrato.Lote.Descripcion;
            lblCargo.Text = contrato.TipoCargo.Descripcion;
            lblEstatus.Text = contrato.StatusContrato.Descripcion;
            if (contrato.FechaInicioContrato != null)
                lblFechaInicio.Text = contrato.FechaInicioContrato.Value.ToString("dd/MM/yyyy");
            if (contrato.FechaTerminoContrato != null)
                lblFechaTermino.Text = contrato.FechaTerminoContrato.Value.ToString("dd/MM/yyyy");
            if (contrato.FechaIngresoCampo != null)
                lblFechaIngresoCampo.Text = contrato.FechaIngresoCampo.Value.ToString("dd/MM/yyyy");
            if (contrato.FechaSalidaCampo != null)
                lblFechaSalidaCampo.Text = contrato.FechaSalidaCampo.Value.ToString("dd/MM/yyyy");
            txtObservaciones.Text = contrato.Observaciones;
            ActionExecutor.Execute(this, delegate
            {
                var entidadGenericaDao = new EntidadGenericaDAO<MotivoLiquidacion>();
                var listado =FormUtils.AddFirst(entidadGenericaDao.ListarActivos(),
                                                                     new MotivoLiquidacion
                                                                     {
                                                                         Codigo = "",
                                                                         Descripcion = "Ninguno"
                                                                     });
                cmbMotivoLiquidacion.DataSource = listado;
                cmbMotivoLiquidacion.SelectedIndex = ObtenerIndiceCombo(listado, contrato.MotivoLiquidacion);

            });
            if (contrato.FechaLiquidacion != null)
                lblFechaLiquidacion.Text = contrato.FechaLiquidacion.Value.ToString("dd/MM/yyyy");
            txtObservacionRenovacion.Text = contrato.ObservacionesRenovacion;
        }

        private int ObtenerIndiceCombo(IList<MotivoLiquidacion> listado, MotivoLiquidacion referencia)
        {
            var indice = 0;
            if (referencia != null)
            {
                var temporal = listado[indice];
                if (temporal != null)
                {
                    while (listado.Count > indice && referencia.Id != temporal.Id)
                    {
                        indice++;
                        temporal = listado[indice];
                    }
                }
            }
            return indice;
        }
        
        
        public void Invalid()
        {
            _valido = false;
        }

        public Boolean IsValid()
        {
            return _valido;
        }

        private void FrmActualizarTrabajador_FormClosing(object sender, FormClosingEventArgs e)
        {
            CerroSinAccion = (contrato.Id==0);
        }

        private void cmbMotivoLiquidacion_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtObservacionRenovacion.Enabled = (cmbMotivoLiquidacion.SelectedIndex != 0);
        }
    }
}
